package com.alangyun.remind.service.excel;

import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import com.alangyun.remind.error.MindException;
import com.alangyun.remind.repository.algorithm.AlgorithmHelper;
import com.alangyun.remind.repository.data.EmployeeCaution;
import com.alangyun.remind.repository.data.EmployeeDataset;
import com.alangyun.remind.repository.data.NameTerm;
import com.alangyun.remind.utils.Utility;

public class EmployeeCautionReader extends AbstractExcelReader {
	private static final int ROW_OFFSET = 1;
	private static final char[][] CHARS = new char[][] {
		{' ', '\0'}, //半角空格
		{'\u3000','\0'}, // CJK空格
		{'\uFF08','('},//全角(
		{'\uFF09',')'},//全角)
		{'\uFF0F','/'},// 全角/
		{'\uFF1A',':'},//全角冒号
		{'\u3001',','}//CJK顿号
	};

	private String catNames(String... names) {
		String ret = "";
		String token = "";
		for (String name : names) {
			if (Utility.emptyOrWhitespace(name))
				continue;

			ret = ret + token + name;
			token = "-";
		}
		return ret;
	}
	
	private String normalizeStr(String source) {
		if (source == null || source.trim().length() == 0)
			return null;

		String ret = "";
		for (int i = 0; i < source.length(); i++) {
			char c = source.charAt(i);
			for (int j = 0; j < CHARS.length; j++) {
				if (c == CHARS[j][0]) {
					c = CHARS[j][1];
					break;
				}
			}
			if (c != '\0')
				ret += c;
		}

		return ret;
	}

	@Override
	protected ParseResult readSheet(Sheet sheet) {

		ParseResult ret = new ParseResult();

		int rowIndex = sheet.getFirstRowNum();
		int rowCount = sheet.getLastRowNum();

		EmployeeDataset dataset = EmployeeDataset.create();
		ret.setObject(dataset);

		Map<String, NameTerm> termMap = new HashMap<>();// 构建索引用
		int increment = 0;

		// 循环处理从Excel读取的数据
		for (int index = rowIndex + ROW_OFFSET; index <= rowCount; index++) {
			Row row = sheet.getRow(index);
			if (row == null)
				break;

			int colIndex = row.getFirstCellNum();
			try {

				String id= PoiUtils.getStringValue(row.getCell(colIndex++)); 
				String name= PoiUtils.getStringValue(row.getCell(colIndex++));
				if(name==null||name.trim().length()==0)
					continue;
				
				EmployeeCaution data = new EmployeeCaution();
				data.setId(id);// 人员编号
				data.setName(name);// 姓名
				String unit = PoiUtils.getStringValue(row.getCell(colIndex++));// 单位
				String depart = PoiUtils.getStringValue(row.getCell(colIndex++));// 部门
				depart = depart == null ? "" : depart.trim();
//				data.setDepartType(PoiUtils.getStringValue(row.getCell(colIndex++)));// 部门类别
				String classGrp = PoiUtils.getStringValue(row.getCell(colIndex++));// 班组/处室
				classGrp = classGrp == null ? "" : classGrp.trim();
				String job01 = PoiUtils.getStringValue(row.getCell(colIndex++));// 岗位大类
				job01 = job01 == null ? "" : job01.trim();
				String job02 = PoiUtils.getStringValue(row.getCell(colIndex++));// 岗位中类
				job02 = job02 == null ? "" : job02.trim();
				String job03 = PoiUtils.getStringValue(row.getCell(colIndex++));// 岗位小类
				job03 = job03 == null ? "" : job03.trim();
				data.setGender(PoiUtils.getStringValue(row.getCell(colIndex++)));// 性别
				data.setBirthday(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 出生年月
				data.setAge(PoiUtils.getIntValue(row.getCell(colIndex++)));// 年龄
				data.setEduDate(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 最高学历毕业时间
				data.setSchool(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学历毕业学校名称
				data.setSubject(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学历所学专业名称
				data.setEduType(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学历学习形式
				data.setHighEdu(normalizeStr(PoiUtils.getStringValue(row.getCell(colIndex++))));// 最高学历
				data.setHighDegree(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学位
				data.setTechName(PoiUtils.getStringValue(row.getCell(colIndex++)));// 专业技术资格名称
				data.setTechMeu(PoiUtils.getStringValue(row.getCell(colIndex++)));// 专业技术资格系列
				String prof = normalizeStr(PoiUtils.getStringValue(row.getCell(colIndex++)));// 专业技术资格等级
				prof = prof == null ? "" : prof.trim();
				data.setTechLevelDate(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 取得资格时间
				data.setSkillAuditType(PoiUtils.getStringValue(row.getCell(colIndex++)));// 技能鉴定工种
				data.setSkillName(normalizeStr(PoiUtils.getStringValue(row.getCell(colIndex++))));// 技能等级
				data.setSkillDate(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 技能资格获取时间

				data.setXrgw(PoiUtils.getStringValue(row.getCell(colIndex++)));// 现任岗位
				data.setHggw(PoiUtils.getStringValue(row.getCell(colIndex++)));//混岗岗位
				data.setSfgjgw(PoiUtils.getBooleanValue(row.getCell(colIndex++)));//是否关键岗位
				data.setSgsj(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 上岗时间
				data.setLgnx(PoiUtils.getIntValue(row.getCell(colIndex++)));// 轮岗年限要求
				data.setJllgsj(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 距离轮岗时间
				data.setSftsgw(PoiUtils.getBooleanValue(row.getCell(colIndex++)));//是否特殊岗位
				data.setTsgwlb(PoiUtils.getStringValue(row.getCell(colIndex++)));//特殊岗位类别
				data.setTsgwzs(PoiUtils.getStringValue(row.getCell(colIndex++)));//特殊岗位证书
				data.setSfcz(PoiUtils.getBooleanValue(row.getCell(colIndex++)));//是否持证
				
				data.setZygwgznx(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 目前所在专业岗位工作年限
				
				data.setShtkzgzs(normalizeStr(PoiUtils.getStringValue(row.getCell(colIndex++))));// 社会统考资格证书
				data.setSczyzgzs(normalizeStr(PoiUtils.getStringValue(row.getCell(colIndex++))));// 生产作业执业资格证书
				
				data.setSnjxzf(PoiUtils.getStringValue(row.getCell(colIndex++)));// 三年绩效得分总分
				data.setSnmzcpqk(normalizeStr(PoiUtils.getStringValue(row.getCell(colIndex++))));// 三年民主测评情况
				data.setGzbxqk(PoiUtils.getStringValue(row.getCell(colIndex++)));// 工作表现情况
				
				data.setYjcgsgjj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 专著、研究成果数(国家级)
				data.setYjcgssbj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 专著、研究成果数（国网公司级）
				data.setYjcgsdsj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 专著、研究成果数（省公司级）
				data.setYjcgsxj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 专著、研究成果数（地市公司级）
				data.setYjcgszj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 专著、研究成果数（县公司级）
				data.setTjjspcgjj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 同级竞赛、调考优秀频次(国家级)
				data.setTjjspcsbj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 同级竞赛、调考优秀频次（国网公司级）
				data.setTjjspcdsj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 同级竞赛、调考优秀频次（省公司级）
				data.setTjjspcxj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 同级竞赛、调考优秀频次（地市公司级）
				data.setTjjspczj(PoiUtils.getIntValue(row.getCell(colIndex++)));// 同级竞赛、调考优秀频次（县公司级）
				
				data.setYbnl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));//专业化能力 - 一般能力
				data.setSrl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));//专业化能力 - 胜任力
				data.setZyzsjn(PoiUtils.getDoubleValue(row.getCell(colIndex++)));//专业化能力 - 专业知识和技能
				
				data.setFzrnx(PoiUtils.getIntValue(row.getCell(colIndex++)));// 部门、班组站负责人年限
				data.setKdwjlcs(PoiUtils.getIntValue(row.getCell(colIndex++)));// 跨单位交流次数
				data.setDwgzfzrnx(PoiUtils.getIntValue(row.getCell(colIndex++)));// 从事党务工作主要负责人年限
				
				data.setCxcxgjj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 创新创效 - 国家级
				data.setCxcxgjjdym(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 是否创新创效 - 国家级第一名
				data.setCxcxsbj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 创新创效 - 国网公司级
				data.setCxcxsbjdym(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 是否创新创效 - 国网公司级第一名
				data.setCxcxdsj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 创新创效 - 省公司级
				data.setCxcxdsjdym(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 是否创新创效 - 省公司级第一名
				data.setCxcxxj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 创新创效 - 地市公司级
				data.setCxcxxjdym(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 是否创新创效 - 地市公司级第一名
				data.setCxcxxzj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 创新创效 - 县公司级
				data.setCxcxxzjdym(PoiUtils.getBooleanValue(row.getCell(colIndex++)));// 是否创新创效 - 县公司级前三名
				
				data.setZhlbzgjj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 综合类表彰 - 国家级
				data.setZhlbzsbj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 综合类表彰 - 国网公司级
				data.setZhlbzdsj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 综合类表彰 - 省公司级
				data.setZhlbzxj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 综合类表彰 - 地市公司级
				data.setZhlbzzj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 综合类表彰 - 县公司级
				data.setZylbzgjj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 专业类表彰 - 国家级
				data.setZylbzsbj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 专业类表彰 - 国网公司级
				data.setZylbzdsj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 专业类表彰 - 省公司级
				data.setZylbzxj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 专业类表彰 - 地市公司级
				data.setZylbzzj(PoiUtils.getIntValue(row.getCell(colIndex++)));//三年荣誉情况 - 专业类表彰 - 县公司级
				
				data.setRcchgjj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));//人才称号 - 国家级
				data.setRcchsbj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));//人才称号 - 国网公司级
				data.setRcchdsj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));//人才称号 - 省公司级
				data.setRcchxj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));//人才称号 - 地市公司级
				data.setRcchzj(PoiUtils.getBooleanValue(row.getCell(colIndex++)));//人才称号 - 县公司级
				
				data.setJsngwjppc(PoiUtils.getIntValue(row.getCell(colIndex++)));// 三年岗位竞聘频次
				data.setJsngzccpc(PoiUtils.getIntValue(row.getCell(colIndex)));// 近三年工作差错频次（减分项）

				// 处理单位
				NameTerm unitTerm = null;
				if (unit.length() > 0) {
					unitTerm = termMap.get(unit);// 单位
					if (unitTerm == null) {
						unitTerm = NameTerm.create(increment++, unit);
						termMap.put(unit, unitTerm);

						dataset.getTeams().add(unitTerm);
					}
					data.setUnit(unitTerm.getId());
					data.setUnitName(unit);
				}
				// 处理部门
				NameTerm departTerm = null;
				if (unitTerm != null && depart.length() > 0) {
					String mapDepart = this.catNames(unit, depart);
					departTerm = termMap.get(mapDepart);// 单位
					if (departTerm == null) {
						departTerm = NameTerm.create(increment++, depart);
						termMap.put(mapDepart, departTerm);
						
						unitTerm.getNodes().add(departTerm);
					}
					data.setDepart(departTerm.getId());
					data.setDepartName(depart);
				}
				// 处理班组
				NameTerm classTerm = null;
				if (departTerm != null && classGrp.length() > 0) {
					String mapClass = this.catNames(unit, depart, classGrp);
					classTerm = termMap.get(mapClass);// 单位
					if (classTerm == null) {
						classTerm = NameTerm.create(increment++, classGrp);
						termMap.put(mapClass, classTerm);
						
						departTerm.getNodes().add(classTerm);
					}
					data.setClassOrGroup(classTerm.getId());
					data.setGroupName(classGrp);
				}
				// 处理岗位
				if (job01.length() > 0) {
					String mapJob = this.catNames("(job)", job01);
					NameTerm jobTerm = termMap.get(mapJob);
					if (jobTerm == null) {
						jobTerm = NameTerm.create(increment++, job01);
						termMap.put(mapJob, jobTerm);

						dataset.getJobs().add(jobTerm);
					}
					data.setJob01(jobTerm.getId());
					data.setJob01Name(job01);
					if(job02.length()>0) {
						mapJob = this.catNames(mapJob, job02);
						NameTerm jobTerm02 = termMap.get(mapJob);
						if (jobTerm02 == null) {
							jobTerm02 = NameTerm.create(increment++, job02);
							termMap.put(mapJob, jobTerm02);

							jobTerm.getNodes().add(jobTerm02);
						}
						data.setJob02(jobTerm02.getId());
						data.setJob02Name(job02);
						if(job03.length()>0) {
							mapJob = this.catNames(mapJob, job03);
							NameTerm jobTerm03 = termMap.get(mapJob);
							if (jobTerm03 == null) {
								jobTerm03 = NameTerm.create(increment++, job03);
								termMap.put(mapJob, jobTerm03);

								jobTerm02.getNodes().add(jobTerm03);
							}
							data.setJob03(jobTerm03.getId());
							data.setJob03Name(job03);
							
						}
					}
				}
				// 处理专业
				if (prof.length() > 0) {
					String mapProf = this.catNames("(prof)", prof);
					NameTerm profTerm = termMap.get(mapProf);
					if (profTerm == null) {
						profTerm = NameTerm.create(increment++, prof);
						termMap.put(mapProf, profTerm);

						dataset.getProfs().add(profTerm);
					}
					data.setTechLevel(profTerm.getId());
					data.setTechLevelName(prof);
				}
				AlgorithmHelper.calcXOfUser(data);
				AlgorithmHelper.calcSinValue(data);
				dataset.getDatas().add(data);
			} catch (MindException me) {
				ret.addError("第" + index + "行:" + me.getMessage());
				e("解析员工管理预警上传数据文件失败", me);
			} catch (Exception ex) {
				ret.addError("第" + index + "行数据有错");
				e("解析员工开发管理预警上传数据文件失败", ex);
			}
		}
		//最标准值和最小值的6维
		AlgorithmHelper.calcSixStandardOfUser(dataset);
		
		//求适配值
		for(EmployeeCaution u: dataset.getDatas()) {
			u.setSuit(u.getSinValue()*100/dataset.getStandardUser().getSinValue());
		}
		

		return ret;
	}

}
